/**
 * @file 	 lnovance_ms.h
 * @brief       
 * @author 	 wangweihu
 * @version  1.0
 * @date 	 2023-12-29
 * 
 * @copyright Copyright (c) 2023  YGL
 * 
 */

#ifndef __LNOVANCE_H
#define __LNOVANCE_H

#include "../../bsp/bsp.h"


#define ADDR_CRL_MODE       0x0001      //控制方式
#define ADDR_PRODUCT_NUMBER 0x0708      //产品号
#define ADDR_CURRENT        0x7004      //输出电流
#define ADDR_ERROR_CODE     0x703E      //当前故障
#define ADDR_STATE          0x703D      //变频器状态

typedef struct{
    int16_t     current;			    //驱动器电流
	uint32_t	errorCode;				//错误Code
    union {
	    uint16_t u16Info;
        struct{
            uint16_t    isRunning           : 1;    //b0：运行
            uint16_t    isForward           : 1;    //b1：正转时
            uint16_t    isReverse           : 1;    //b2：反转时
            uint16_t    isfreqArrive        : 1;    //b3：频率到达
            uint16_t    isOverload          : 1;    //b4：过载
            uint16_t    isParemResetEnd     : 1;    //b5：参数复位结束
            uint16_t    freqDetect          : 1;    //b6：频率检测
            uint16_t    isAlarmOccurred     : 1;    //b7：发生报警
            uint16_t    resvertBit8         : 1;    //b8：保留
            uint16_t    resvertBit9         : 1;    //b9：保留
            uint16_t    resvertBit10        : 1;    //b10：保留
            uint16_t    stateE0             : 1;    //b11：变频器E0状态
            uint16_t    resvertBit12        : 1;    //b12：保留
            uint16_t    resvertBit13        : 1;    //b13：保留
            uint16_t    isResetting         : 1;    //b14：变频器复位期间
            uint16_t    isTuning            : 1;    //b15：调谐中
        }Bit;
    }state;
}Type_Lnovance_Param_Def;

typedef struct{
	uint8_t 	slave_id;    		    //modbus slave id
	uint8_t 	port;    			    //modbus uart port
    uint32_t 	speed;   			    //modbus uart speed
    uint8_t 	rec_data[20];    	    //modbus recive buffer
    uint8_t 	rec_len; 			    //modbus recive data length
}Type_Lnovance_Com_Def;

typedef struct
{
	uint16_t		mode;               //变频器操作模式
    bool            isInitOk;
	Type_Lnovance_Com_Def 	com;
	
    Type_GPIO_Def   DI1;
    Type_GPIO_Def   DI2;
    Type_GPIO_Def   DI3;
    Type_GPIO_Def   DI4;  

	Type_Lnovance_Param_Def 	param;
}Type_Lnovance_Def;


/**
 * @description: 初始化士林变频器
 * @param {Type_lnovance_Def} pList :变频器列表
 * @param {uint8_t} listLen         :变频器列表长度
 * @return {bool}                   :初始化成功返回true
 */
extern bool xp_lnovance_init(Type_Lnovance_Def * const pList, uint8_t listLen);

/**
 * @description: 驱动卸载
 * @return {bool}                   :卸载成功返回true
 */
extern bool xp_lnovance_Deinit(void);

/**
 * @description: 士林变频器设置运转
 * @param {uint8_t} devId           :变频器编号(此编号非驱动器slave id)
 * @param {Type_Speed_Enum} speed   :速度级别参数,正负控制方向,为0则停止
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_lnovance_run(uint8_t devId, int speed);

/**
 * @description: 获取变频器错误码
 * @param {int} devId               :变频器序号
 * @param {uint32_t} *pResult       :返回结果
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_lnovance_get_error_code(int devId, uint32_t *pResult);

/**
 * @description: 获取变频器电流
 * @param {int} devId               :变频器序号
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_lnovance_get_current(int devId, int16_t *pResult);

/**
 * @description: 获取变频器状态
 * @param {int} devId               :变频器序号
 * @param {uint32_t} *pResult       :返回结果
 * @return {bool}                   :设置成功返回true
 */
bool xp_lnovance_get_state(int devId, uint16_t *pResult);

/**
 * @description: 清除驱动器错误
 * @param {int}                     :变频器序号 
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_lnovance_clear_error(int devId);

/**
 * @description: 设置1567段速(通过M0 M1 IO选择预置速度)
 * @param {int}                     :变频器序号 
 * @param {uint16_t}                :段速1
 * @param {uint16_t}                :段速5
 * @param {uint16_t}                :段速6
 * @param {uint16_t}                :段速7
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_lnovance_set_stage_speed(int devId, uint16_t speed_1, uint16_t speed_5, uint16_t speed_6, uint16_t speed_7);
#endif